/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.Animal;
import entidades.DetalleEnfermedad;
import entidades.DetalleMuerte;
import entidades.Empleado;
import entidades.Historial;
import entidades.Item;
import entidades.Sexo;
import entidades.TipoEvento;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.DATE;

/**
 *
 * @author Facundo
 */
public class HistorialDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public HistorialDAO(Connection con) {
        this.conDB = con;
    }

    public HistorialDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * Metodo para insertar un historial
     * Recibe por parametro un objeto historial
     * El historial se inserta en la base con los siguientes datos:
     * numero
     * codigo_animal
     * codigo_tipo_evento
     * fecha
     * codigo_empleado
     * descripcion
     */
    public boolean put(Historial his) {
        System.out.println("Insertando en la tabla PC_HISTORIAL.");
        boolean ret = false;
        try {
            if (this.getConDB().getAutoCommit()) {
                this.getConDB().setAutoCommit(false);
            }
            /*
             * buscamos el codigo del animal
             */
            System.out.println("Se busca el codigo de animal: ");
            int codigoAnimal = new AnimalDAO(this.getConDB()).getCodigoAnimal(his.getAnimal());
            System.out.println("Codigo de animal: " + codigoAnimal);
            /*
             * buscamos el numero del ultimo historial registrado y le sumamos uno
             */
            int codigoHistorial = this.getUltimoCodigo() + 1;
            System.out.println("Ultimo codigo de historial encontrado: " + codigoHistorial);
            /*
             * buscamos el codigo del tipo de evento
             */
            int codigoTipoEvento = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(his.getTipo_evento());

            /*
             * Manejamos la fecha del historial
             */
            String fecha = his.getFecha().toString();
            String fecha_dia = fecha.substring(8);
            String fecha_año = fecha.substring(0, 4);
            String fecha_mes = fecha.substring(5, 7);
            /*
             * aca verificamos que no exista un historial igual. Es decir no puede haber un historial
             * del mismo tipo de evento, en el mismo dia y para el mismo animal
             */
            Historial aux = this.getHistorial(codigoAnimal, his.getFecha(), codigoTipoEvento); // siempre va a ser distinto a null, y siempre trae el mismo historial
//            Historial aux=this.getHistorial(codigoHistorial);
            if (aux == null) {
                /*
                 * Empezamos insertando sus detalles..
                 */
                System.out.println("Insertando los detalles del historial...");
                if (his.getDetalle_muerte() != null) {
                    Iterator iter = his.getDetalle_muerte().iterator();
                    DetalleMuerte detMuerte = (DetalleMuerte) iter.next();
                    new DetalleMuerteDAO(this.getConDB()).put(detMuerte, codigoHistorial);
                    //Actualizamos el estado de la jaula como libre, ya que el animal murio...
                    new JaulaDAO(this.getConDB()).updateEstadoJaula(his.getAnimal().getUbicacion(), new EstadoJaulaDAO(this.getConDB()).getEstadoJaula("LIBRE"));
                }

//                if (his.getDetalle_enfermedad() != null) {
//                    Iterator iter = his.getLista_det_enfermedad().iterator();
//                    while (iter.hasNext()) {
//                        DetalleEnfermedad detalle = (DetalleEnfermedad) iter.next();
//                        new DetalleEnfermedadDAO(this.getConDB()).put(detalle, codigoHistorial);
//                    }
//                }


                Empleado emple_aux = new EmpleadoDAO(this.getConDB()).getEmpleado(1);
                his.setEmpleado(emple_aux);



                String sentencia = "insert into PC_HISTORIAL (numero,codigo_animal,codigo_tipo_evento,fecha,codigo_empleado,descripcion)"
                        + " values (" + codigoHistorial + "," + codigoAnimal + "," + codigoTipoEvento + ","
                        + "to_date('" + his.getFecha().dateValue() + "','yyyy/MM/DD HH:MI'),"
                        + //                            fecha_año+ "-"+fecha_dia+"-"+fecha_mes+  "',"+
                        his.getEmpleado().getLegajo() + ",'" + his.getDescripcion() + "')";

                System.out.println("Sentencia utilizada para realizar la insercion del historial:" + sentencia);

                setQuery(sentencia);
                setPst(getConDB().prepareStatement(sentencia));
                ret = getPst().execute();


                System.out.println("Insertando detalle de enfermedad...");
                DetalleEnfermedad detalle = his.getDetalle_enfermedad();
                if (detalle != null) {
                    int codigoDetalleEnfermedad = new DetalleEnfermedadDAO(this.getConDB()).getUltimoCodigoDetEnfermedad() + 1;
                    int codigoEnfermedad = new EnfermedadDAO(this.getConDB()).devolverCodigoEnfermedad(detalle.getEnfermedad().getNombre());
//                    new DetalleEnfermedadDAO(this.getConDB()).nuevoPut(his.getDetalle_enfermedad(), codigoHistorial);
                    String sqlDetalle = "insert into PC_DETALLE_ENFERMEDAD (codigo_detalle, codigo_historial, codigo_enfermedad,fecha_deteccion,observaciones) "
                            + " values (" + codigoDetalleEnfermedad + "," + codigoHistorial + "," + codigoEnfermedad + ",to_date('" + detalle.getFecha_deteccion().dateValue() + "','yyyy/MM/DD HH:MI'),'" + detalle.getObservaciones() + "')";
                    System.out.println("Sentencia que inserta en pc_detalle_enfermedad: " + sqlDetalle);
                    setPst(getConDB().prepareStatement(sqlDetalle));
                    ret = getPst().execute();
                }


                this.getConDB().commit();
                getPst().close();
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            try {
                Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Excepcion: " + ex.getMessage() + ". Sentencia utilizada: " + this.getQuery());
                this.getConDB().rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
        return false;
    }

    /*
     * Metodo que devuelve el codigo del ultimo historial registrado en la base
     */
    public int getUltimoCodigo() {
        setQuery("select MAX(numero) AS numero from PC_HISTORIAL");
        int codigo = this.devolverCodigoHistorial(getQuery());
        return codigo;

    }

    /*
     * Metodo que devuelve el codigo de un historial, de acuerdo a la sentencia recibida por parametro
     */
    private int devolverCodigoHistorial(String sentencia) {
        int codigo = 0;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigo = rs.getInt("numero");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("DEVOLVERCODIGOHISTORIAL, codigo de historial: " + codigo + " query:" + sentencia);
        return codigo;
    }

    /*
     * Metodo que devuelve un Historial de acuerdo al numero del mismo recibido por parametro
     */
    public Historial getHistorial(int numero) {
        Historial histo = null;
        setQuery("select * from PC_HISTORIAL where numero=" + numero);
        histo = this.devolverHistorial(getQuery());
        return histo;
    }

    /*
     * Metodo que devuelve un historial de acuerdo al animal, a la fecha y al tipo de evento
     */
    public Historial getHistorial(int codigo_animal, DATE fechaHistorial, int codigo_evento) {
        Historial histo = null;
        String fecha = fechaHistorial.toString();
        String fecha_dia = fecha.substring(8);
        String fecha_año = fecha.substring(0, 4);
        String fecha_mes = fecha.substring(5, 7);
        String sql = "select * from PC_HISTORIAL where codigo_animal=" + codigo_animal + " and codigo_tipo_evento=" + codigo_evento
                + " and fecha=to_date('" + String.valueOf(fechaHistorial.dateValue()) + "','yyyy/MM/DD HH:MI')";
        System.out.println("sentencia que se usa en el metodo GETHISTORIAL: " + sql);
        setQuery(sql);


//                " fecha='" + fecha_año+ "-"+fecha_dia+"-"+fecha_mes+ "'");
        histo = this.devolverHistorial(getQuery());
        return histo;
    }

    /*
     * Metodo que devuelve un historial de acuerdo a la sentencia recibida por parametro
     */
    private Historial devolverHistorial(String sentencia) {
        Historial histo = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                histo = new Historial();
                histo.setAnimal(new AnimalDAO(this.getConDB()).getAnimal(rs.getInt("codigo_animal")));
                histo.setEmpleado(new EmpleadoDAO(this.getConDB()).getEmpleado(rs.getInt("codigo_empleado")));
                histo.setFecha(new DATE(rs.getDate("fecha")));
                histo.setTipo_evento(new TipoEventoDAO(this.getConDB()).getTipoEvento(rs.getInt("codigo_tipo_evento")));
                if (rs.getString("descripcion") != null) {
                    histo.setDescripcion(rs.getString("descripcion"));
                }
                histo.setDetalle_muerte(new DetalleMuerteDAO(this.getConDB()).getDetalleMuerteArray(rs.getInt("numero")));
//                histo.setDetalle_enfermedad(new DetalleEnfermedadDAO(this.getConDB()).getDetalleEnfermedades(rs.getInt("numero")));
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return histo;
    }

    /*
     * Metodo que devuelve un ArrayList con los historiales de aquel animal que todavia
     * tiene enfermedades por curarse.
     * Se recibe como parametro un objeto animal. Se retorna un Array
     */
    public ArrayList getHistorialesConEnfermedadSinCurar(Animal ani) {
        ArrayList todos = null;
        /*
         * obtenemos el codigo del animal recibido por parametro
         */
        int codigoAnimal = new AnimalDAO(this.getConDB()).getCodigoAnimal(ani);
        setQuery("select * from PC_HISTORIAL where codigo_animal =" + codigoAnimal
                + " and numero in (select df.codigo_historial from PC_DETALLE_ENFERMEDAD df"
                + " where df.fecha_curacion is null);");
        todos = this.devolverHistoriales(getQuery());
        return todos;
    }

    /*
     * Metodo que devuelve un arrayList de historiales
     * por parametro..
     */
    public ArrayList getHistorial(String nombre) {
        try {
            ArrayList todos = new ArrayList();
//            Animal res_animal = new Animal();
//            res_animal.setNombre(nombre);
//            int cod_animal = new AnimalDAO(this.getConDB()).getCodigoAnimal(res_animal);
            String sql = "SELECT * FROM vista_historial WHERE animal='" + nombre + "'";
            System.out.println("Sentencia utilizada para devolver el historial del animal seleccionado: " + sql);
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = getPst().executeQuery();
            while (rs.next()) {
                Historial hist = new Historial();
                hist.setFecha(new DATE(rs.getString("fecha")));
                TipoEvento te = new TipoEvento();
                te.setNombre(rs.getString("evento"));
                hist.setTipo_evento(te);
                Empleado emple = new Empleado();
                emple.setNombre(rs.getString("empleado"));
                hist.setEmpleado(emple);
                todos.add(hist);
            }
            //        todos = this.devolverHistoriales(sql);
            return todos;
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public String getHistoriales(String nombre) {
        try {
            String sql = "SELECT * FROM vista_historial WHERE animal='" + nombre + "'";
            String msj = new String();
            this.setQuery(sql);
            this.setPst(getConDB().prepareStatement(this.getQuery()));
            ResultSet rs = getPst().executeQuery();
            while (rs.next()) {
                msj += " *) Fecha: " + rs.getString("fecha");
//                msj+=" - Animal: "+rs.getString("animal");
                msj += " - Evento realizado: " + rs.getString("evento");
                msj += " - Empleado: " + rs.getString("empleado");
                msj += "\n";
            }
            return msj;
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion: " + ex.getMessage() + ". Sentencia utilizada: " + this.getQuery());
        }
        return null;
    }

    /*
     * Metodo que retorna un arrayList de tipo de historiales, de acuerdo a la sentencia
     * recibida como parametro de entrada
     */
    private ArrayList devolverHistoriales(String sentencia) {
        try {
            ArrayList todos = null;
            Historial histo = null;
            ResultSet rs;
            setQuery(sentencia);
            todos = new ArrayList();
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                histo = new Historial();
                histo.setAnimal(new AnimalDAO(this.getConDB()).getAnimal(rs.getInt("codigo_animal")));
                histo.setEmpleado(new EmpleadoDAO(this.getConDB()).getEmpleado(rs.getInt("codigo_empleado")));
                histo.setFecha(new DATE(rs.getDate("fecha")));
                histo.setTipo_evento(new TipoEventoDAO(this.getConDB()).getTipoEvento(rs.getInt("codigo_tipo_evento")));
                if (rs.getString("descripcion") != null) {
                    histo.setDescripcion(rs.getString("descripcion"));
                }
                histo.setDetalle_muerte(new DetalleMuerteDAO(this.getConDB()).getDetalleMuerteArray(rs.getInt("numero")));
//                histo.setDetalle_enfermedad(new DetalleEnfermedadDAO(this.getConDB()).getDetalleEnfermedades(rs.getInt("numero")));
                todos.add(histo);
            }
            rs.close();
            getPst().close();
            return todos;
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion: " + ex.getMessage() + ". Sentencia: " + this.getQuery());
        }
        return null;
    }

    /*
     * Metodo que true si un animal tiene en su historial un detalle de muerte (se supone que esta muerto)
     */
    public Historial getHistorialMuerte(int codigoAnimal) {
        Historial histo = null;
        setQuery("select * from PC_HISTORIAL "
                + " where codigo_animal = " + codigoAnimal
                + " and numero in (select d.codigo_historial "
                + " from PC_DETALLE_MUERTE d)");
        System.out.println(getQuery());
        ResultSet rs = null;
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                histo = new Historial();
                histo.setDetalle_muerte(new DetalleMuerteDAO(this.getConDB()).getDetalleMuerteArray(rs.getInt("numero")));
                System.out.println(histo.getDetalle_muerte().isEmpty());
                System.out.println("zzzzzzzzzzzzzzzzzzzzzzzzzzz");
                if (histo.getDetalle_muerte() == null) {
                    return null;
                }
            }
            getPst().close();
            rs.close();

        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return histo;

    }

    public ArrayList getAnimalesFamilia(Sexo res_sexo, TipoEvento e_ralgro, TipoEvento e_asignado_familia, TipoEvento e_peleteo) {
        try {
            char cod_sexo = res_sexo.getNombre();
            int cod_e_ralgro = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(e_ralgro);
            int cod_e_asignado = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(e_asignado_familia);
            int cod_e_peleteo = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(e_peleteo);
            int cod_animal_familia = -1;
            Animal res_animal = null;
            ArrayList res_getAnimalesFamilia = new ArrayList();
            String sql = "SELECT DISTINCT codigo_animal FROM pc_historial WHERE codigo_animal not in "
                    + "(SELECT codigo_animal FROM pc_historial WHERE codigo_tipo_evento in (" + cod_e_asignado + "," + cod_e_peleteo + "," + cod_e_ralgro + ")) "
                    + "and codigo_animal in (SELECT codigo_animal FROM pc_animal WHERE codigo_sexo='" + cod_sexo + "')";
            System.out.println("Sentencia utilizada que devuelve los " + res_sexo.getDescripcion() + " que no han sido ralgreado, asignado y peleteado: " + sql);
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = this.getPst().executeQuery();
            while (rs.next()) {
                cod_animal_familia = rs.getInt("codigo_animal");
                res_animal = new AnimalDAO(this.getConDB()).getAnimal(cod_animal_familia);
                res_getAnimalesFamilia.add(res_animal);
            }
            rs.close();
            this.getPst().close();
            return res_getAnimalesFamilia;
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public ArrayList getHistorialEvento(int tipo_evento, int dias) {
        String sql = "select * from pc_historial where codigo_tipo_evento=" + tipo_evento + " and fecha >= sysdate - " + dias + "  order by fecha desc, CODIGO_ANIMAL asc";
        System.out.println("Sentencia para devolver historiales por fecha y evento: " + sql);
        ArrayList res = this.devolverHistoriales(sql);
        return res;
    }

    public boolean putMuerte(Historial his) {
        boolean ret = false;
        try {
            /*
             * buscamos el codigo del animal
             */
            int codigoAnimal = new AnimalDAO(this.getConDB()).getCodigoAnimal(his.getAnimal());
            /*
             * buscamos el numero del ultimo historial registrado y le sumamos uno
             */
            int codigoHistorial = this.getUltimoCodigo();
            if (codigoHistorial == -1) {
                codigoHistorial = codigoHistorial + 2;
            } else {
                codigoHistorial = codigoHistorial + 1;
            }
            /*
             * buscamos el codigo del tipo de evento
             */
            int codigoTipoEvento = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(his.getTipo_evento());
            /*
             * aca verificamos que no exista un historial igual. Es decir no puede haber un historial
             * del mismo tipo de evento, en el mismo dia y para el mismo animal
             */
            Historial aux = this.getHistorial(codigoAnimal, his.getFecha(), codigoTipoEvento);
            System.out.println(codigoHistorial);
            if (aux == null) {
                setQuery("insert into PC_HISTORIAL (numero,codigo_animal,codigo_tipo_evento,fecha,codigo_empleado,descripcion)"
                        + " values (" + codigoHistorial + "," + codigoAnimal + "," + codigoTipoEvento + ", to_date('" + his.getFecha().dateValue() + "','YYYY-MM-DD'),"
                        + his.getEmpleado().getLegajo() + ",'" + his.getDescripcion() + "')");
                setPst(getConDB().prepareStatement(getQuery()));

                ret = getPst().execute();
                getPst().close();
                /*
                 * Empezamos insertando sus detalles..
                 */
                if (his.getDetalle_muerte() != null) {
                    Iterator iter = his.getDetalle_muerte().iterator();
                    DetalleMuerte detMuerte = (DetalleMuerte) iter.next();
                    System.out.println("sale al put del detaleeeee" + detMuerte.getTipo_muerte().getNombre());
                    new DetalleMuerteDAO(this.getConDB()).put(detMuerte, codigoHistorial);
                    //Actualizamos el estado de la jaula como libre, ya que el animal murio...
                    //depende si vive un solo gazapo
                    //hacer metodo en jaulaDao para saber si hay mas de un habitante en esa jaula
                    System.out.println("va a las jaulassss");
                    if (new JaulaDAO(this.getConDB()).getCantidadGazapos(his.getAnimal().getUbicacion()) == 1) {
                        new JaulaDAO(this.getConDB()).updateEstadoJaula(his.getAnimal().getUbicacion(), new EstadoJaulaDAO(this.getConDB()).getEstadoJaula("LIBRE"));
                    }
                    //se debe borrar la jaula en el animal!!!!!!!!!!!!!!, se pasa como parametro
                    //-1 para que la columna codigo_ubicacion quede como null
                    new AnimalDAO_facu(this.getConDB()).updateJaula(codigoAnimal, -1);
                }
                if (his.getDetalle_enfermedad() != null) {
                    Iterator iter = his.getLista_det_enfermedad().iterator();
                    while (iter.hasNext()) {
                        DetalleEnfermedad detalle = (DetalleEnfermedad) iter.next();
                        new DetalleEnfermedadDAO(this.getConDB()).put(detalle, codigoHistorial);
                    }
                }
                return true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    public ArrayList getActividades(int destete, int peleteo, int ralgro, DATE fecha) {
        try {
            ArrayList res_actividades = new ArrayList();
            String sql = null;
            Item res_item = null;
            System.out.println("Valores pasados por parametro: D:" + destete + " P:" + peleteo + " R:" + ralgro);
            String sqlDestete = "select 'DESTETE' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_destete_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='DESTETE'))";
            String sqlRalgro = "select 'RALGRO' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_ralgro_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in  "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='RALGRO')) ";
            String sqlPeleteo = "select  'PELETEO' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_peleteo_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='PELETEO'))";
            if (destete != -1 && peleteo != -1 && ralgro != -1) {
                sql = sqlDestete + " union " + sqlRalgro + "union " + sqlPeleteo;
            }
            if (destete != -1 && peleteo == -1 && ralgro == -1) {
                sql = sqlDestete;
            }
            if (destete == -1 && peleteo == -1 && ralgro != -1) {
                sql = sqlRalgro;
            }
            if (destete == -1 && peleteo != -1 && ralgro == -1) {
                sql = sqlPeleteo;
            }
            if (destete == -1 && peleteo != -1 && ralgro != -1) {
                sql = sqlPeleteo + " union " + sqlRalgro;
            }
            if (destete != -1 && peleteo == -1 && ralgro != -1) {
                sql = sqlDestete + " union " + sqlRalgro;
            }
            if (destete != -1 && peleteo != -1 && ralgro == -1) {
                sql = sqlDestete + " union " + sqlPeleteo;
            }
            if (sql != null) {
                this.setPst(this.getConDB().prepareStatement(sql));
                ResultSet rs = this.getPst().executeQuery();
                System.out.println("Sentencia para devolver el plan de actividades: " + sql);
                while (rs.next()) {
                    res_item = new Item();
                    res_item.setTipo_evento(rs.getString("evento"));
                    res_item.setAnimal(new AnimalDAO(this.getConDB()).getAnimal(rs.getInt("codigo")));
                    res_actividades.add(res_item);
                }
                this.getPst().close();
                rs.close();
                return res_actividades;
            }
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion: " + ex.getMessage());
        }
        return null;
    }

    public boolean hayActividades(DATE fecha) {
        boolean res = false;
        try {
            String sqlDestete = "select 'DESTETE' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_destete_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='DESTETE'))";
            String sqlRalgro = "select 'RALGRO' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_ralgro_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in  "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='RALGRO')) ";
            String sqlPeleteo = "select  'PELETEO' as evento , ani.codigo_animal as codigo from pc_animal ani "
                    + " where fecha_peleteo_aproximada <= to_date('" + String.valueOf(fecha.dateValue())
                    + "','yyyy/MM/DD HH:MI') and ani.codigo_animal not in "
                    + " ( SELECT hist.codigo_animal FROM pc_historial hist  WHERE hist.codigo_tipo_evento in "
                    + " ( SELECT teve.codigo_evento FROM pc_tipo_evento teve WHERE teve.nombre ='PELETEO'))";
            String sql = sqlDestete + " union " + sqlRalgro + "union " + sqlPeleteo;
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = this.getPst().executeQuery();
            System.out.println("Sentencia para devolver el plan de actividades: " + sql);
            while (rs.next()) {
                res = true;
                break;
            }
            this.getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return res;
    }

    public boolean putIngreso(Historial his) {
        System.out.println("Insertando en la tabla PC_HISTORIAL.");
        boolean ret = false;
        try {
            /*
             * buscamos el codigo del animal
             */
            System.out.println("Se busca el codigo de animal: ");
            int codigoAnimal = new AnimalDAO_facu(this.getConDB()).getCodigoAnimal(his.getAnimal());
            System.out.println("Codigo de animal: " + codigoAnimal);
            /*
             * buscamos el numero del ultimo historial registrado y le sumamos uno
             */
            int codigoHistorial = this.getUltimoCodigo() + 1;
            System.out.println("Ultimo codigo de historial encontrado: " + codigoHistorial);
            /*
             * buscamos el codigo del tipo de evento
             */
            int codigoTipoEvento = new TipoEventoDAO(this.getConDB()).getCodigoTipoEvento(his.getTipo_evento());

            /*
             * Manejamos la fecha del historial
             */
            String fecha = his.getFecha().toString();
            String fecha_dia = fecha.substring(8);
            String fecha_año = fecha.substring(0, 4);
            String fecha_mes = fecha.substring(5, 7);
            /*
             * aca verificamos que no exista un historial igual. Es decir no puede haber un historial
             * del mismo tipo de evento, en el mismo dia y para el mismo animal
             */
            Historial aux = this.getHistorial(codigoAnimal, his.getFecha(), codigoTipoEvento); // siempre va a ser distinto a null, y siempre trae el mismo historial
//            Historial aux=this.getHistorial(codigoHistorial);
            if (aux == null) {



                Empleado emple_aux = new EmpleadoDAO(this.getConDB()).getEmpleado(1);
                his.setEmpleado(emple_aux);



                String sentencia = "insert into PC_HISTORIAL (numero,codigo_animal,codigo_tipo_evento,fecha,codigo_empleado,descripcion)"
                        + " values (" + codigoHistorial + "," + codigoAnimal + "," + codigoTipoEvento + ","
                        + "to_date('" + his.getFecha().dateValue() + "','yyyy/MM/DD HH:MI'),"
                        + //                            fecha_año+ "-"+fecha_dia+"-"+fecha_mes+  "',"+
                        his.getEmpleado().getLegajo() + ",'" + his.getDescripcion() + "')";

                System.out.println("Sentencia utilizada para realizar la insercion del historial:" + sentencia);

                /*
                 * Empezamos insertando sus detalles..
                 */
                System.out.println("Insertando los detalles del historial...");
                if (his.getDetalle_muerte() != null) {
                    Iterator iter = his.getDetalle_muerte().iterator();
                    DetalleMuerte detMuerte = (DetalleMuerte) iter.next();
                    new DetalleMuerteDAO(this.getConDB()).put(detMuerte, codigoHistorial);
                    //Actualizamos el estado de la jaula como libre, ya que el animal murio...
                    new JaulaDAO(this.getConDB()).updateEstadoJaula(his.getAnimal().getUbicacion(), new EstadoJaulaDAO(this.getConDB()).getEstadoJaula("LIBRE"));
                }
                System.out.println("Insertando detalle de enfermedad...");
                if (his.getDetalle_enfermedad() != null) {
                    Iterator iter = his.getLista_det_enfermedad().iterator();
                    while (iter.hasNext()) {
                        DetalleEnfermedad detalle = (DetalleEnfermedad) iter.next();
                        new DetalleEnfermedadDAO(this.getConDB()).put(detalle, codigoHistorial);
                    }
                }

                setQuery(sentencia);
                setPst(getConDB().prepareStatement(sentencia));
                ret = getPst().execute();
                getPst().close();
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion: " + ex.getMessage() + ". Sentencia utilizada: " + this.getQuery());
        }
        return false;
    }
}
